<?php

class JSSDK
{
	private $appId;
	private $appSecret;
	public function __construct($appId, $appSecret)
	{
		$this->appId = $appId;
		$this->appSecret = $appSecret;
	}
	public function getSignPackage()
	{
		$jsapiTicket = $this->getJsApiTicket();
		$protocol = !empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] !== "off" || $_SERVER["SERVER_PORT"] == 443 ? "https://" : "http://";
		$url = "{$protocol}{$_SERVER["HTTP_HOST"]}{$_SERVER["REQUEST_URI"]}";
		$timestamp = time();
		$nonceStr = $this->createNonceStr();
		$string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
		$signature = sha1($string);
		$signPackage = array("appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string);
		return $signPackage;
	}
	private function createNonceStr($length = 16)
	{
		$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		$str = '';
		$i = 0;
		while ($i < $length) {
			$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
			$i++;
		}
		return $str;
	}
	private function getJsApiTicket()
	{
		$data = json_decode($this->get_php_file(MODULE_URL . "jsapi_ticket.json"));
		if ($data->expire_time < time()) {
			$accessToken = $this->getAccessToken();
			$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token={$accessToken}";
			$res = json_decode($this->httpGet($url));
			$ticket = $res->ticket;
			if ($ticket) {
				$data->expire_time = time() + 7000;
				$data->jsapi_ticket = $ticket;
				$this->set_php_file(MODULE_URL . "jsapi_ticket.json", json_encode($data));
			}
		} else {
			$ticket = $data->jsapi_ticket;
		}
		return $ticket;
	}
	public function getAccessToken()
	{
		$data = json_decode($this->get_php_file(MODULE_URL . "access_token.json"));
		if ($data->expire_time < time()) {
			$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
			$res = json_decode($this->httpGet($url));
			$access_token = $res->access_token;
			if ($access_token) {
				$data->expire_time = time() + 7000;
				$data->access_token = $access_token;
				$this->set_php_file(MODULE_URL . "access_token.json", json_encode($data));
			}
		} else {
			$access_token = $data->access_token;
		}
		return $access_token;
	}
	private function httpGet($url)
	{
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_TIMEOUT, 500);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
		curl_setopt($curl, CURLOPT_URL, $url);
		$res = curl_exec($curl);
		curl_close($curl);
		return $res;
	}
	private function get_php_file($filename)
	{
		return file_get_contents($filename);
	}
	private function set_php_file($filename, $content)
	{
		@file_put_contents($filename, $content);
	}
}